<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;

class Cart extends Model
{
    use HasFactory;

    protected $fillable = [
        'user_id',
        'session_id',
    ];

    /**
     * 获取购物车所属用户
     */
    public function user(): BelongsTo
    {
        return $this->belongsTo(User::class);
    }

    /**
     * 获取购物车商品项
     */
    public function items(): HasMany
    {
        return $this->hasMany(CartItem::class);
    }

    /**
     * 获取购物车总数量
     */
    public function getTotalQuantityAttribute(): int
    {
        return $this->items->sum('quantity');
    }

    /**
     * 获取选中的商品项
     */
    public function getSelectedItemsAttribute()
    {
        return $this->items->where('is_selected', true);
    }

    /**
     * 获取失效的商品项（库存为0或已下架）
     */
    public function getInvalidItemsAttribute()
    {
        return $this->items->filter(function ($item) {
            // 检查商品是否存在
            if (!$item->product) {
                return true;
            }

            // 检查商品是否下架
            if (!$item->product->is_active) {
                return true;
            }

            // 如果有变体，检查变体
            if ($item->variant_id) {
                if (!$item->variant) {
                    return true;
                }
                
                // 检查变体是否下架或库存为0
                if (!$item->variant->is_active || $item->variant->stock_quantity <= 0) {
                    return true;
                }
            } else {
                // 检查商品库存
                if ($item->product->stock_quantity <= 0) {
                    return true;
                }
            }

            return false;
        });
    }

    /**
     * 获取有效的商品项
     */
    public function getValidItemsAttribute()
    {
        return $this->items->filter(function ($item) {
            // 检查商品是否存在且上架
            if (!$item->product || !$item->product->is_active) {
                return false;
            }

            // 如果有变体，检查变体
            if ($item->variant_id) {
                if (!$item->variant) {
                    return false;
                }
                
                // 检查变体是否上架且有库存
                if (!$item->variant->is_active || $item->variant->stock_quantity <= 0) {
                    return false;
                }
            } else {
                // 检查商品库存
                if ($item->product->stock_quantity <= 0) {
                    return false;
                }
            }

            return true;
        });
    }

    /**
     * 获取选中商品的小计（不含运费和优惠）
     */
    public function getSelectedSubtotalAttribute(): float
    {
        return $this->selectedItems->sum(function ($item) {
            return $item->price * $item->quantity;
        });
    }

    /**
     * 获取选中商品的总数量
     */
    public function getSelectedQuantityAttribute(): int
    {
        return $this->selectedItems->sum('quantity');
    }

    /**
     * 获取商品小计（所有商品，不含运费和优惠）
     */
    public function getSubtotalAttribute(): float
    {
        return $this->items->sum(function ($item) {
            return $item->price * $item->quantity;
        });
    }

    /**
     * 获取运费（基于选中商品）
     */
    public function getShippingFeeAttribute(): float
    {
        // 没有选中商品时不计算运费
        if ($this->selected_subtotal == 0) {
            return 0;
        }
        
        // 从系统设置读取运费配置
        $shippingFee = (float) SystemSetting::get('default_shipping_fee', 50);
        $freeThreshold = (float) SystemSetting::get('free_shipping_threshold', 1000);
        
        return $this->selected_subtotal >= $freeThreshold ? 0 : $shippingFee;
    }

    /**
     * 获取优惠金额
     */
    public function getDiscountAttribute(): float
    {
        // TODO: 实现优惠券逻辑
        return 0;
    }

    /**
     * 获取购物车总金额（基于选中商品，含运费，扣除优惠）
     */
    public function getTotalAmountAttribute(): float
    {
        return $this->selected_subtotal + $this->shipping_fee - $this->discount;
    }

    /**
     * 根据用户ID或session ID查找购物车
     */
    public static function findByUserOrSession($userId = null, $sessionId = null): ?self
    {
        if ($userId) {
            return static::where('user_id', $userId)->first();
        }
        
        if ($sessionId) {
            return static::where('session_id', $sessionId)->first();
        }
        
        return null;
    }

    /**
     * 获取或创建购物车
     */
    public static function getOrCreate($userId = null, $sessionId = null): self
    {
        $cart = static::findByUserOrSession($userId, $sessionId);
        
        if (!$cart) {
            $cart = static::create([
                'user_id' => $userId,
                'session_id' => $sessionId,
            ]);
        }
        
        return $cart;
    }
}
